home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Archive / QuickTime / QuickTime VR / Make QTVR Object / QTVRObjectAuthoring.c < prev    next >
Encoding:
Text File  |  2000-09-28  |  10.3 KB  |  376 lines  |  [TEXT/CWIE]

  1. //
  2. //         This is sample code which will make QTVR object movies from Linear QuickTime movies.
  3. //
  4. //        © 1991-1996 Apple Computer, Inc.  All rights reserved.
  5. //
  6.  
  7.  
  8. #include "MakeQTVRObject.h"
  9. #include "extern.h" 
  10.  
  11. //=================================================================================================
  12. // DeleteObjectMovieData1x0
  13. //   -- Delete the QTVR 1.0 object movie data.
  14. //   -- Errors returned:
  15. //            QuickTime errors, Toolbox errors. 
  16. //-------------------------------------------------------------------------------------------------
  17. pascal OSErr DeleteQTVRObjectFileFormat1x0 (
  18.                         Movie        movie,
  19.                         short        movieResFref,
  20.                         short        movieResID,
  21.                         FSSpec        movieSFFile)
  22. {
  23.     UserData    uDat;
  24.     OSErr        err;
  25.     FInfo        finderInfo;
  26.     
  27.     if (movie == nil) return (invalidMovie);
  28.  
  29.     // Remove movie user data
  30.     uDat = GetMovieUserData (movie);
  31.     if ((err = GetMoviesError()) != noErr)
  32.         {
  33.         UserMessage("\pCould not get user data item.");
  34.         return (err);
  35.         }
  36.     RemoveUserData (uDat, 'ctyp', kControllerID);            // Delete special controller
  37.     if ((err = GetMoviesError()) != noErr) 
  38.         {
  39.         UserMessage("\pCould not remove controller type.");
  40.         return (err);
  41.         }
  42.     RemoveUserData (uDat, 'NAVG', 1);                        // Delete object movie data
  43.     if ((err = GetMoviesError()) != noErr)
  44.         {
  45.         UserMessage("\pCould not remove NAVG atom.");
  46.         return (err);
  47.         }
  48.  
  49.     // Remove the file preview
  50.     SetMoviePreviewTime (movie, 0, 0);
  51.     if ((err = GetMoviesError()) != noErr)
  52.         {
  53.         UserMessage("\pCould not set preview time.");
  54.         return (err);
  55.         }
  56.     
  57.     // Change creator type back to MoviePlayer
  58.     err = HGetFInfo (movieSFFile.vRefNum, movieSFFile.parID, movieSFFile.name, &finderInfo);
  59.     if (err != noErr) 
  60.         {
  61.         UserMessage("\pCould not get creator type.");
  62.         return (err);
  63.         }
  64.     finderInfo.fdCreator = kMoviePlayerCreatorType;
  65.     err = HSetFInfo (movieSFFile.vRefNum, movieSFFile.parID, movieSFFile.name, &finderInfo);
  66.     if (err != noErr) 
  67.         {
  68.         UserMessage("\pCould not set creator type.");
  69.         return (err);
  70.         }
  71.     
  72.     // Update the movie file itself
  73.     err = AddFilePreview (movieResFref, 0, nil);
  74.     if (err != noErr)
  75.         {
  76.         UserMessage("\pCould add a file preview.");
  77.         return (err);
  78.         }
  79.     err = UpdateMovieResource (movie, movieResFref, movieResID, 0);
  80.     if (err != noErr)
  81.         {
  82.         UserMessage("\pCould not update movie resource.");
  83.         return (err);
  84.         }
  85.     UpdateResFile (movieResFref);
  86.     if ((err = ResError()) != noErr)
  87.         {
  88.         UserMessage("\pCould not update resource file.");
  89.         return (err);
  90.         }
  91.     
  92.     
  93.     return (noErr);
  94. }
  95.  
  96.  
  97. //=================================================================================================
  98. // DoSetStartUpView
  99. //-------------------------------------------------------------------------------------------------
  100. OSErr DoSetStartUpView (MovieInstance    *theInstance)
  101. {
  102.     OSErr err;
  103.     Movie            movie;
  104.  
  105.     if ( theInstance == nil)
  106.         {
  107.         UserMessage("\pBad instance.");
  108.         return (paramErr);
  109.         }
  110.  
  111.     movie = theInstance->movie;
  112.  
  113.     if (movie == nil) 
  114.         {
  115.         UserMessage("\pBad movie.");
  116.         return (paramErr);
  117.         }
  118.     
  119.     {
  120.         TimeValue    posterViewTime;
  121.         QTVRObjectFileFormat1x0Record    fileFormat;
  122.         err = GetQTVRObjectFileFormat1x0 (
  123.                                 movie,
  124.                                 &fileFormat);
  125.         posterViewTime = MCGetCurrentTime (theInstance->movieController, nil);
  126.         ConvertTimeToPanUtil (posterViewTime,  
  127.                                 fileFormat.frameDuration,
  128.                                 fileFormat.numberOfColumns,
  129.                                 fileFormat.numberOfRows,
  130.                                 fileFormat.loopSize,
  131.                                 fileFormat.startHPan,
  132.                                 fileFormat.endHPan,
  133.                                 fileFormat.startVPan,
  134.                                 fileFormat.endVPan,
  135.                                 &fileFormat.initialHPan, 
  136.                                 &fileFormat.initialVPan);
  137.         gPrefInf.objectInfo.initialVPan = fileFormat.initialVPan;
  138.         gPrefInf.objectInfo.initialHPan = fileFormat.initialHPan;
  139.         err = SetQTVRObjectFileFormat1x0 (
  140.                                     movie,
  141.                                     theInstance->movieResFile,
  142.                                     theInstance->movieResID,
  143.                                     theInstance->spec,
  144.                                     posterViewTime,
  145.                                     &fileFormat);
  146.  
  147.     }
  148.     
  149.     
  150.     return (noErr);
  151. }
  152.  
  153. //=================================================================================================
  154. // StuffQTVRObjectFileFormat1x0
  155. //   -- Error returned:
  156. //            qtParamErr            - if parameter is out of range
  157. //-------------------------------------------------------------------------------------------------
  158. OSErr StuffQTVRObjectFileFormat1x0 (short        movieType,
  159.                                     TimeValue    frameDuration,
  160.                                     short        numberOfColumns,
  161.                                     short        numberOfRows,
  162.                                     short        loopSize,
  163.                                     short        loopTicks,
  164.                                     Fixed        startHPan,
  165.                                     Fixed        endHPan,
  166.                                     Fixed        startVPan,
  167.                                     Fixed        endVPan,
  168.                                     Fixed        fieldOfView,
  169.                                     Fixed        initialHPan,
  170.                                     Fixed        initialVPan,
  171.                                     QTVRObjectFileFormat1x0Ptr    fileFormatPtr)
  172. {
  173.     
  174.     if (numberOfColumns <= 0)
  175.         {
  176.         UserMessage("\pColumns must be > 0.");
  177.         return (qtParamErr);
  178.         }
  179.     if (numberOfRows    <= 0)
  180.         {
  181.         UserMessage("\pRows must be > 0.");
  182.         return (qtParamErr);
  183.         }
  184.     if (loopSize        <= 0)
  185.         {
  186.         UserMessage("\pLoop size must be > 0.");
  187.         return (qtParamErr);
  188.         }
  189.     if (fieldOfView     <= 0)
  190.         {
  191.         UserMessage("\pField of view must be > 0.");
  192.         return (qtParamErr);
  193.         }
  194.     if (startHPan   > endHPan)
  195.         {
  196.         UserMessage("\pEnding HPan must be greater than strarting HPan.");
  197.         return (qtParamErr);
  198.         }
  199.     if (startVPan   < endVPan)
  200.         {
  201.         UserMessage("\pStarting VPan must be greater than ending VPan.");
  202.         return (qtParamErr);
  203.         }
  204.     
  205.         
  206.     fileFormatPtr->reserved1        = 0;                        // For compatibility, always 0
  207.     fileFormatPtr->reserved2        = 0;
  208.     fileFormatPtr->frameDuration    = (short) frameDuration;
  209.     fileFormatPtr->versionNumber    = 1;
  210.     fileFormatPtr->numberOfColumns    = numberOfColumns;
  211.     fileFormatPtr->numberOfRows        = numberOfRows;
  212.     fileFormatPtr->loopSize            = loopSize;
  213.     fileFormatPtr->loopTicks        = loopTicks;
  214.     fileFormatPtr->movieType        = movieType;
  215.     fileFormatPtr->startHPan        = startHPan;
  216.     fileFormatPtr->endHPan            = endHPan;
  217.     fileFormatPtr->startVPan        = startVPan;
  218.     fileFormatPtr->endVPan            = endVPan;
  219.     fileFormatPtr->initialHPan        = initialHPan;
  220.     fileFormatPtr->initialVPan        = initialVPan;
  221.     fileFormatPtr->fieldOfView        = fieldOfView;
  222.     
  223.     return (noErr);
  224. }
  225.  
  226. //=================================================================================================
  227. // SetQTVRObjectMovieData1x0
  228. //-------------------------------------------------------------------------------------------------
  229. pascal OSErr SetQTVRObjectFileFormat1x0 (
  230.                         Movie        movie,
  231.                         short        movieResFref,
  232.                         short        movieResID,
  233.                         FSSpec        movieSFFile,
  234.                         TimeValue    posterViewTime,
  235.                         const QTVRObjectFileFormat1x0Ptr    fileFormatPtr)
  236. {
  237.     OSType        myComponentSubType    = 'stna';
  238.     UserData    uDat                = GetMovieUserData (movie);
  239.     OSErr        err;
  240.     FInfo        finderInfo;
  241.     
  242.     if (movie == nil) return (invalidMovie);
  243.     
  244.     // Save navigable data
  245.     err = SetUserDataItem (uDat, fileFormatPtr, sizeof (QTVRObjectFileFormat1x0Record), 'NAVG', 1);
  246.     if (err != noErr)
  247.         {
  248.         UserMessage("\pCould not set user data item.");
  249.         return (err);
  250.         }
  251.     // Set Controller type to Nav controller
  252.     err = SetUserDataItem (uDat, &myComponentSubType, sizeof (myComponentSubType), 'ctyp', 1);
  253.     if (err != noErr)
  254.         {
  255.         UserMessage("\pCould not set ctype.");
  256.         return (err);
  257.         }
  258.     
  259.     // Set current time to poster view time.
  260.     SetMovieTimeValue (movie, posterViewTime);
  261.  
  262.     // Set the poster time to posterViewTime.  For looping movie, this guarantees
  263.     // that the QT will draw with the key frame first.
  264.     SetMoviePosterTime (movie, posterViewTime);
  265.  
  266.     // Make a movie's preview with duration equal to the animation loop.
  267.     SetMoviePreviewTime (movie, posterViewTime, fileFormatPtr->frameDuration * fileFormatPtr->loopSize);
  268.     
  269.     // Change creator type to QTVRPlayer
  270.     err = HGetFInfo (movieSFFile.vRefNum, movieSFFile.parID, movieSFFile.name, &finderInfo);
  271.     if (err != noErr)
  272.         {
  273.         UserMessage("\pCould not get creator type.");
  274.         return (err);
  275.         }
  276.     finderInfo.fdCreator = kQTVRPlayerCreatorType;
  277.     err = HSetFInfo (movieSFFile.vRefNum, movieSFFile.parID, movieSFFile.name, &finderInfo);
  278.     if (err != noErr)
  279.         {
  280.         UserMessage("\pCould not set creator type.");
  281.         return (err);
  282.         }
  283.     
  284.     // Update the movie file itself
  285.     err = UpdateMovieResource (movie, movieResFref, movieResID, 0);
  286.     if (err != noErr)
  287.         {
  288.         UserMessage("\pCould not update movie resource.");
  289.         return (err);
  290.         }
  291.     UpdateResFile (movieResFref);
  292.     if ((err = ResError()) != noErr)
  293.         {
  294.         UserMessage("\pCould not update resource file.");
  295.         return (err);
  296.         }
  297.     return (noErr);
  298. }
  299.  
  300. //=================================================================================================
  301. // GetQTVRObjectMovieData1x0
  302. //     -- Caller is is responsible to make sure 
  303. //   -- Errors returned:
  304. //            userDataItemNotFound - if QTVR Object file format data is not found 
  305. //            featureUnsupported   - if file format version is not 1.0. 
  306. //-------------------------------------------------------------------------------------------------
  307. pascal OSErr GetQTVRObjectFileFormat1x0 (
  308.                         Movie        movie,
  309.                         QTVRObjectFileFormat1x0Ptr    fileFormatPtr)
  310. {
  311.     OSErr    err;
  312.     
  313.     QTVRObjectFileFormat1x0Record tempFileFormat;
  314.     err = GetUserDataItem (GetMovieUserData (movie), &tempFileFormat, sizeof (QTVRObjectFileFormat1x0Record), 'NAVG', 1);
  315.     if (err != noErr)
  316.         {
  317.         UserMessage("\pCould not get user data. This movie is not an Object movie.");
  318.         return (err);
  319.         }
  320.     if (tempFileFormat.versionNumber != 1)
  321.         {
  322.         UserMessage("\pFeature Unsupported.");
  323.         return (featureUnsupported);
  324.         }
  325.         
  326.     *fileFormatPtr = tempFileFormat;
  327.     return (noErr);
  328. }
  329.  
  330. //=================================================================================================
  331. // Convert from QuickTime time to pan parameters
  332. //-------------------------------------------------------------------------------------------------
  333. void ConvertTimeToPanUtil (TimeValue time, 
  334.                             TimeValue frameDuration,
  335.                             short numColumns,
  336.                             short numRows,
  337.                             short loopSize,
  338.                             Fixed startHPan,
  339.                             Fixed endHPan,
  340.                             Fixed startVPan,
  341.                             Fixed endVPan,
  342.                             Fixed *hPan,
  343.                             Fixed *vPan)
  344. {
  345.     
  346.     short        row, column;
  347.     TimeValue    rc;
  348.     Fixed        panHRange;
  349.     Fixed        panVRange;
  350.     
  351.     panHRange  = endHPan   - startHPan;
  352.     panVRange  = startVPan - endVPan;
  353.  
  354.     time /= frameDuration;                // Adjust for frameDuration
  355.     
  356.     rc = time / loopSize;
  357.     row    = rc / numColumns;
  358.     column = rc % numColumns;
  359.     
  360.     // Note mixed Fixed and integer math. 
  361.     if (numColumns == 1) {
  362.         *hPan = startHPan;
  363.     } else if (panHRange == Long2Fix (360)) {
  364.         *hPan = column * (panHRange / (numColumns  )) + startHPan;
  365.     } else {
  366.         *hPan = column * (panHRange / (numColumns-1)) + startHPan;
  367.     }
  368.     
  369.     if (numRows == 1) {
  370.         *vPan = startVPan;
  371.     } else {
  372.         *vPan = startVPan - row * (panVRange / (numRows-1));
  373.     }
  374. }
  375.  
  376.